using IQIGame.Onigao.Framework;
using System.Collections.Generic;

namespace IQIGame.Onigao.Game
{
    /// <summary>
    /// 管理中心分布类，处理核心逻辑
    /// 由于该类属于框架扩展层，需要热更新和等待加载，初始化，所以相关管理器（如UI，Entity等）的初始化时机会比底层FramworkEntry相关的管理器更晚。
    /// </summary>
    public partial class ManagerCenter : MonoBehaviourOptimized
    {
        /// <summary>
        /// 主线程id
        /// </summary>
        public static int mainThreadId { get; private set; }
        //框架扩展层管理器缓存
        private static List<FrameMonoModule> s_CustomFrameMgrs;

        protected override void Awake()
        {
            s_CustomFrameMgrs = new List<FrameMonoModule>();
        }

        private void Start()
        {
            mainThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
            InitFrameworkMgrRefs();
            InitFrameworkExtMgrRefs();
            //由于热更新的限制，初始化时机延后，框架扩展层的管理器初始化需要在这里手动调用一次
            InitAllModules();
            //由于当前已经是进入游戏的阶段了，所以直接调用EnterGame();
            //Framework底层的EnterGame()会在这之前被调用，紧接着就是这里
            EnterGame();
        }

        public T GetModule<T>() where T : FrameMonoModule
        {
            T module = FrameworkEntry.GetModule<T>();
            if (!s_CustomFrameMgrs.Contains(module))
            {
                s_CustomFrameMgrs.Add(module);
            }
            return module;
        }

        private void InitAllModules()
        {
            for (int i = 0; i < s_CustomFrameMgrs.Count; i++)
            {
                s_CustomFrameMgrs[i].Init();
            }
        }

        public void EnterGame()
        {
            for (int i = 0; i < s_CustomFrameMgrs.Count; i++)
            {
                s_CustomFrameMgrs[i].EnterGame();
            }
        }
    }
}
